-
-
Save jwage/b1614c96ea22ccaf68b7 to your computer and use it in GitHub Desktop.
<?php | |
return Symfony\CS\Config\Config::create() | |
->level(Symfony\CS\FixerInterface::SYMFONY_LEVEL) | |
->fixers([ | |
'short_array_syntax', | |
'ordered_use', | |
]) | |
; |
#!/usr/bin/env bash | |
ROOT="/path/to/your/code" | |
echo "php-cs-fixer pre commit hook start" | |
PHP_CS_FIXER="vendor/bin/php-cs-fixer" | |
HAS_PHP_CS_FIXER=false | |
if [ -x vendor/bin/php-cs-fixer ]; then | |
HAS_PHP_CS_FIXER=true | |
fi | |
if $HAS_PHP_CS_FIXER; then | |
git status --porcelain | grep -e '^[AM]\(.*\).php$' | cut -c 3- | while read line; do | |
$PHP_CS_FIXER fix --config-file=$ROOT/.php_cs --verbose "$line"; | |
git add "$line"; | |
done | |
else | |
echo "" | |
echo "Please install php-cs-fixer, e.g.:" | |
echo "" | |
echo " composer require --dev fabpot/php-cs-fixer:dev-master" | |
echo "" | |
fi | |
echo "php-cs-fixer pre commit hook finish" |
the ROOT variable is not so necessary:
https://stackoverflow.com/questions/7065224/in-a-git-hook-is-the-current-working-directory-guaranteed-to-be-within-the-git-r
I found the running of the php-cs-fixer per line unnecessary slow, changed it to this:
FILES=` git status --porcelain | grep -e '^[AM]\(.*\).php$' | cut -c 3- | tr '\n' ' '`
$PHP_CS_FIXER fix --config=.php_cs ${FILES}
git add ${FILES}
This simplifies the git lines into one single line, because php-cs-fixer can accept multiple paths. It's faster.
if no php file exists in commit, php-cs-fixer run all over the php files of the repo. To avoid this, check FILES to not null then run php-cs-fixer.
FILES=` git status --porcelain | grep -e '^[AM]\(.*\).php$' | cut -c 3- | tr '\n' ' '`
if [ -z "$FILES" ]
then
echo "php files not found."
else
$PHP_CS_FIXER fix --config=.php_cs --verbose ${FILES}
git add ${FILES}
fi
I put all the comments together into one script. You can also just include the directories you want enclosed in () and separated by | One problem might be too many files in a commit to specify on a command line, but I did not see any file input options for phpcsfixer.
#!/usr/bin/env bash
echo "php-cs-fixer pre commit hook start"
PHP_CS_FIXER="vendor/bin/php-cs-fixer"
HAS_PHP_CS_FIXER=false
if [ -x $PHP_CS_FIXER ]; then
HAS_PHP_CS_FIXER=true
fi
if $HAS_PHP_CS_FIXER; then
FILES=` git status --porcelain | grep -E '^[AM] +(App|public|Tests|views).*\.php$' | cut -c 4- | tr '\n' ' '`
if [ -z "$FILES" ]
then
echo "No php files found in commit."
else
echo ${FILES}
$PHP_CS_FIXER fix --config=.php_cs.dist --verbose ${FILES}
git add ${FILES}
fi
else
echo ""
echo "Please install php-cs-fixer, e.g.:"
echo ""
echo " composer require --dev fabpot/php-cs-fixer:dev-master"
echo ""
exit 1
fi
echo "php-cs-fixer pre commit hook finish"
This script has worked well for us. However, I did run into one odd behavior. This script will lint and commit all the PHP files that have changed, even if those files are not staged for commit. This tweak lints only staged files:
FILES=`git status --porcelain=v2 | grep -E '^\d [AM].*(App|public|Tests|views).*\.php$' | cut -d ' ' -f 9 | tr '\n' ' '`
We also found that merge commits could end up linting tons of files. We elected to skip merge commits:
if git rev-parse -q --verify MERGE_HEAD; then
echo "This is a merge commit. Skipping linting just in case it's a big one!"
exit 0
fi
Grep pattern is missing heading whitespace:
# instead of
grep -e '^[AM]\(.*\).php$'
# do
grep -e '^\s*[AM]\(.*\).php$'
Actually, ls-files does a better job:
git ls-files -m | grep -e '.php$' | xargs vendor/bin/php-cs-fixer fix
use lint staged is also a nice solution https://sebastiandedeyne.com/running-php-cs-fixer-on-every-commit-with-husky-and-lint-staged/
With the --config option you can specify the path to the .php_cs file.
in new version.